Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.06.2016, 18:00
Новичок на форуме
Отправить личное сообщение для whoim Посмотреть профиль Найти все сообщения от whoim
 
Регистрация: 13.06.2016
Сообщений: 5

setTimeout и xmlhttprequest во множественном числе
Приветствую!
Система мониторинга серверов. Специфическая, под задачу.

На php генерируется около 30 js-строк вида
setTimeout('load_data(\'".$row[0]."\')', 50);


вызывающие функцию load_data одновременно с разными параметрами. Это срабатывает, в отладке появляется сразу пачка запросом от функции

function load_data(id) {
  var xmlhttp = new XMLHttpRequest();
  var url = "scriptname.php?id="+id;

  xmlhttp.onreadystatechange = function() {
      if(xmlhttp.readyState == 4) {
          if (xmlhttp.status == 200) {
              var result = JSON.parse(xmlhttp.responseText);
              show_data(id,result);
          }
          setTimeout('load_data('+id+')', 100);
      }
  };
  xmlhttp.open("GET", url, true);
  xmlhttp.send();
}


функция навешивает на окончание запроса обработку полученных данных (показ на странице) и "планирует" сама себя через setTimeout, через 100 мс.

Вот тут и вопрос. После первой "пачки" все остальные запросы идут в очереди. А так как скрипт, к которому обращается xmlhttprequest, работает 2-3 секунды, то и обновление идет черезвычайно долго.

В общем, запрос первый раз идут пачкой, а в дальнейшем - по очереди, один запрос в 2-3 секунды, хотя как мне думается, тоже должны идти пачкой.
Отчего так? Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 13.06.2016, 18:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

А зачем пачка запросов, что за задачу решаете?
Ответить с цитированием
  #3 (permalink)  
Старый 14.06.2016, 11:47
Новичок на форуме
Отправить личное сообщение для whoim Посмотреть профиль Найти все сообщения от whoim
 
Регистрация: 13.06.2016
Сообщений: 5

Быстрый мониторинг cpu, ram, loadavg, pps, byte per sec, занято дисков.
Хочется, чтобы на каждый сервер обновления шли раз в 2-5 сек, а они по очереди идут
Ответить с цитированием
  #4 (permalink)  
Старый 14.06.2016, 11:55
Аватар для Botik21
Аспирант
Отправить личное сообщение для Botik21 Посмотреть профиль Найти все сообщения от Botik21
 
Регистрация: 01.06.2016
Сообщений: 87

Потому, что у вас setTimeout вызывается индивидуально после завершения каждого запроса, а т.к. они все завершаются в разное время и получается что новые запросы идут в порядке завершения.
Ответить с цитированием
  #5 (permalink)  
Старый 15.06.2016, 14:13
Новичок на форуме
Отправить личное сообщение для whoim Посмотреть профиль Найти все сообщения от whoim
 
Регистрация: 13.06.2016
Сообщений: 5

Сообщение от Botik21 Посмотреть сообщение
Потому, что у вас setTimeout вызывается индивидуально после завершения каждого запроса, а т.к. они все завершаются в разное время и получается что новые запросы идут в порядке завершения.
Да, но первоначальная пачка запросов вызывается одновременно. завершаются в разное время, это так, но не в порядке очереди. И только после этого начинает выстраиваться очередь.

Это нужно чтобы добиться асинхронности, то есть не начинать новый запрос, пока не завершен старый.
Ответить с цитированием
  #6 (permalink)  
Старый 15.06.2016, 14:16
Новичок на форуме
Отправить личное сообщение для whoim Посмотреть профиль Найти все сообщения от whoim
 
Регистрация: 13.06.2016
Сообщений: 5

Я еще раз посмотрел процесс - да, вызываются то они одновременно, но ответ получают СТРОГО по очереди. Причем время ответа растет равномерно:


Получается, что xmlhttprequest не может работать одновременно так, как вызываю его я? Или это проблемы на стороне сервера, дающего ответ?

Последний раз редактировалось whoim, 15.06.2016 в 14:31.
Ответить с цитированием
  #7 (permalink)  
Старый 15.06.2016, 14:28
Новичок на форуме
Отправить личное сообщение для whoim Посмотреть профиль Найти все сообщения от whoim
 
Регистрация: 13.06.2016
Сообщений: 5

Поставил у вызываемого скрипта заглушку - die с нормальными данными якобы мониторинга.
Все залетало, конечно, но запросы по прежнему идут СТРОГО по очереди.
Вызов начинается в одно время, и так чтобы какой то более "поздний" запрос ответил раньше, чем более "ранний" - такого нет. Строго по очереди.


Вру. Есть и те, которые были инициированы позже, но ответили раньше.

Последний раз редактировалось whoim, 15.06.2016 в 14:32.
Ответить с цитированием
  #8 (permalink)  
Старый 15.06.2016, 14:51
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от whoim Посмотреть сообщение
Это нужно чтобы добиться асинхронности, то есть не начинать новый запрос, пока не завершен старый.

whoim, трудность твоя в том, что ты не понимаешь иностранного слова "Асинхронность". Если его не понимаешь, то лучше его вообще не использовать, иначе не сможешь передать свои мысли другим - они будут очень искажены и далеки от твоих желаний. Ты посылаешь через AJAX (Asynchronous Javascript and XML) асинхронные запросы, а ждёшь синхронных ответов.

Вот, почитай - там найдёшь ответ на свой вопрос:
Введение в Ajax
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
запрос на другой сайт XMLHttpRequest vscorpion Internet Explorer 9 24.12.2013 16:46
xmlHttpRequest подскажите czp AJAX и COMET 4 10.12.2012 23:23
XmlHttpRequest возвращает пустую строку ilta AJAX и COMET 2 14.11.2012 14:52
XMLHttpRequest status=0, хотя запрос проходит. arigasa AJAX и COMET 4 15.02.2011 20:14